package operateDB

import (
	"database/sql"
	"fmt"
	"log"
	"time"

	"myproject/config"

	_ "github.com/go-sql-driver/mysql" // 导入MySQL驱动
)

var db *sql.DB
var err error

func InitDB() {
	username := config.AppConfig.Database.Username
	password := config.AppConfig.Database.Password
	dbName := config.AppConfig.Database.DBName
	addr := config.AppConfig.Database.Addr

	// 构建DSN (数据源名称)
	dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8mb4&parseTime=True",
		username, password, addr, dbName)

	// 打开数据库连接
	db, err = sql.Open("mysql", dsn)

	if err != nil {
		log.Fatalf("无法打开数据库连接: %v", err)
	}
	defer func(db *sql.DB) {
		err := db.Close()
		if err != nil {
			log.Println(err)
		}
	}(db) // 程序退出时关闭连接

	// 验证连接是否成功
	if err := db.Ping(); err != nil {
		log.Fatalf("无法连接到数据库: %v", err)
	}
	fmt.Println("成功连接到本地数据库！")

	Register()
	queryDB()
}

func queryDB() {
	// 只查询需要的字段（避免*带来的字段顺序问题）
	rows, err := db.Query("select id, username, status from users")
	if err != nil {
		log.Fatalf("查询失败: %v", err)
	}
	defer rows.Close() // 确保关闭结果集

	// 循环读取每一行
	for rows.Next() {
		// 定义变量接收字段值（根据查询的字段顺序）
		var id int
		var username string
		var status sql.NullInt32 // 用sql.Null类型处理可能为NULL的字段

		// 扫描数据到变量
		err := rows.Scan(&id, &username, &status)
		if err != nil {
			log.Printf("解析失败: %v", err)
			continue
		}

		// 处理NULL值（status可能为NULL）
		statusStr := "未设置"
		if status.Valid {
			statusStr = fmt.Sprintf("%d", status.Int32)
		}

		// 打印结果
		fmt.Printf("ID: %d, 用户名: %s, 状态: %s\n", id, username, statusStr)
	}

	// 检查遍历过程中的错误
	if err := rows.Err(); err != nil {
		log.Fatalf("遍历出错: %v", err)
	}
}

type User struct {
	Username               string
	Userpassword           string
	Status                 uint8 // 指针类型支持NULL值
	Online                 uint8
	IsVip                  uint8
	RegisterDate           time.Time
	LoginDate              time.Time
	OfflineDate            time.Time
	UseNum                 int
	TextTranslateNum       int
	RealtimeTranslateNum   int
	RealtimeTranslateTimes int
	TextTranslateTimes     int
}

// InsertUser 向users表插入一条用户数据
func InsertUser(user User) (int64, error) {
	// 构建插入SQL，id为自增字段不需要手动插入
	sqlStr := `INSERT INTO users (
		username, userpassword, status, online, isVip,
		register_date, login_date, offline_date,
		use_num, textTranslate_num, realtimeTranslate_num,
		realtimeTranslateTimes, textTranslateTimes
	) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`

	// 执行插入操作
	result, err := db.Exec(sqlStr,
		user.Username,
		user.Userpassword,
		user.Status,
		user.Online,
		user.IsVip,
		user.RegisterDate,
		user.LoginDate,
		user.OfflineDate,
		user.UseNum,
		user.TextTranslateNum,
		user.RealtimeTranslateNum,
		user.RealtimeTranslateTimes,
		user.TextTranslateTimes,
	)
	if err != nil {
		return 0, fmt.Errorf("插入数据失败: %v", err)
	}

	// 获取插入的自增ID
	lastInsertID, err := result.LastInsertId()
	if err != nil {
		return 0, fmt.Errorf("获取插入ID失败: %v", err)
	}

	return lastInsertID, nil
}

func Register() {
	user := User{
		Username:               "test",
		Userpassword:           "test",
		Status:                 0,
		IsVip:                  1,
		RegisterDate:           time.Now(),
		LoginDate:              time.Now(),
		OfflineDate:            time.Now(),
		UseNum:                 0,
		TextTranslateNum:       0,
		RealtimeTranslateNum:   0,
		RealtimeTranslateTimes: 100,
		TextTranslateTimes:     100,
	}

	i, err := InsertUser(user)
	if err != nil {

	}
	fmt.Println(i)
	fmt.Println("插入完成")
}
